Skip to content

[codex] Allow opt-in self-hosted registration#4438

Open
swhan0329 wants to merge 16 commits into
Dokploy:canaryfrom
swhan0329:codex/allow-self-hosted-registration
Open

[codex] Allow opt-in self-hosted registration#4438
swhan0329 wants to merge 16 commits into
Dokploy:canaryfrom
swhan0329:codex/allow-self-hosted-registration

Conversation

@swhan0329

@swhan0329 swhan0329 commented May 20, 2026

Copy link
Copy Markdown

Summary

Adds an opt-in self-hosted registration path for the unchecked “Enable the option to register new users” item from #1413.

Self-hosted instances still keep the existing safe default: once an owner exists, /register redirects back to login and server-side sign-up is blocked. When an operator explicitly sets DOKPLOY_ALLOW_REGISTRATION=true, the login page exposes the registration link, /register remains reachable, and non-invited email sign-ups can create their own default organization.

Details

  • Adds DOKPLOY_ALLOW_REGISTRATION, defaulting to disabled unless the env value is exactly true.
  • Keeps first-owner setup behavior unchanged for fresh self-hosted installs.
  • Keeps invitation and SSO flows separate from the new open-registration path.
  • Guards invited self-hosted signups so the opt-in open-registration path does not create an extra default owner organization for invitation-based onboarding.
  • Adds the env var to local and production env examples.
  • Adds focused unit coverage for the opt-in flag parser and the default-organization creation decision.

Validation

  • pnpm exec biome check --write --no-errors-on-unmatched --files-ignore-unknown=true packages/server/src/constants/index.ts packages/server/src/lib/auth.ts apps/dokploy/__test__/auth/registration-config.test.ts
  • pnpm --filter=dokploy exec vitest run __test__/auth/registration-config.test.ts --config __test__/vitest.config.ts
  • pnpm --filter=dokploy run typecheck
  • pnpm --filter=@dokploy/server run typecheck

Note: local validation ran on Node v20.18.1, so pnpm emitted the repository engine warning for Node ^24.4.0, but the listed checks completed successfully.

/claim #1413

ngenohkevin and others added 15 commits May 12, 2026 21:35
The empty-records branch of `main()` returned without calling
`process.exit(0)`, leaving the Drizzle Postgres connection pool
holding the event loop open. The `migrate-auth-secret` process
then hangs indefinitely after printing "No 2FA records found,
nothing to migrate." causing the upstream `0.29.3.sh` security
migration script (which calls this via `docker exec`) to never
reach its final `docker service update` step that mounts the new
Docker Secret. Operators end up with the new secret created but
the dokploy service still configured with the hardcoded
`BETTER_AUTH_SECRET`, while believing the migration completed.

Match the success branch a few lines below which already does
`process.exit(0)`, and the pattern used in sibling scripts
`reset-password.ts` and `reset-2fa.ts`.

Closes Dokploy#4392
…ret-exit-on-empty

fix(migrate-auth-secret): exit cleanly when there are no 2FA records
Adds an "Import" option to the Create Service dropdown that lets users
paste a base64-encoded compose export, preview the template (compose YAML,
domains, envs, mounts) before confirming, and create the service only on
confirm. Adds a `previewTemplate` tRPC procedure that processes the base64
without touching the DB, with server access validation via session.
…-base64

feat(compose): add import from base64 in create service dropdown
- Updated the GitHub Actions workflow to sync versioning across MCP, CLI, and SDK repositories.
- Added steps to bump the version in the SDK repository and regenerate tools from the latest OpenAPI spec.
- Improved commit message formatting to include source and release information for all repositories.
- Ensured successful synchronization messages for each repository after the version update.
- Introduced a new `readLogs` procedure that allows users to retrieve logs for a specific deployment by providing the deployment ID and an optional tail parameter.
- Implemented permission checks to ensure users have access to the requested logs.
- Enhanced log retrieval for both cloud and non-cloud environments, utilizing appropriate commands based on the server context.

Resolve Dokploy/mcp#14
- Implemented server access validation in deployment procedures to ensure users can only access deployments associated with their active organization.
- Added checks to throw an UNAUTHORIZED error if a user attempts to access a deployment linked to a server outside their organization.

This enhancement improves security and access control within the deployment management system.
- Added validation to prevent users from being invited with the owner role in the organization and user routers.
- Implemented TRPCError responses to ensure proper error handling when attempting to assign the owner role.
This change enhances role management and security within the organization structure.

https://github.com/Dokploy/dokploy/security/advisories/GHSA-fm9p-wmpw-gxjh
- Added functionality to delete old sessions when a user updates their password, ensuring that only the current session remains active.
- This change enhances security by preventing unauthorized access from previous sessions after a password change.

Close here https://github.com/Dokploy/dokploy/security/advisories/GHSA-rr9m-w87g-46f3
* fix: copy Dokploy server IP when clicking server badge

When a service runs on the local Dokploy server (no remote server),
clicking the server badge did nothing because `data.server` is null.
Now falls back to the server IP from settings so the badge always
copies an IP address.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(copy-ip): implement IP address copying functionality across database service components

- Added the ability to copy the server IP address to the clipboard when clicking the server badge in various database service components (Libsql, MariaDB, MongoDB, MySQL, PostgreSQL, Redis).
- Integrated the `copy-to-clipboard` library and `sonner` for user feedback upon successful copy action.
- Ensured fallback to the server IP from settings when the service data is not available, enhancing user experience and functionality.

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
Signed-off-by: Nahidujjaman Hridoy <hridoyboss12@gmail.com>
@swhan0329 swhan0329 requested a review from Siumauricio as a code owner May 20, 2026 18:48
@dosubot dosubot Bot added size:M This PR changes 30-99 lines, ignoring generated files. enhancement New feature or request labels May 20, 2026
@swhan0329

Copy link
Copy Markdown
Author

Added local UI proof for the DOKPLOY_ALLOW_REGISTRATION=true flow requested in the issue thread.

Proof setup:

  • Fresh local Postgres proof DB with migrations applied.
  • Inserted one owner user/org/member row to simulate an existing self-hosted owner.
  • Started the Dokploy app with DOKPLOY_ALLOW_REGISTRATION=true.

Verified behavior:

  • / returns 200 OK and shows the login page with the Create an account link.
  • /register returns 200 OK and shows the Sign Up / Register form after an owner already exists.
  • Curl proof also found registrationEnabled":true in the /register SSR payload.

Login page with registration link:

Login page with Create an account link

Registration page remains available after owner exists:

Registration page available with DOKPLOY_ALLOW_REGISTRATION=true

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🙋 Bounty claim enhancement New feature or request size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants